import static java.lang.Thread.sleep;

/**
 * 认识线程
 *      2.Thread类及常见方法
 *      3.线程的状态
 */
public class Test {
    /**
     * 线程的状态
     * @param args
     *      1.观察线程的所有状态
     *      2.线程状态和状态转移的意义
     *
     */
    /**
     * 线程状态和状态转移的意义
     * @param args
     */
    public static void main(String[] args) {
        /**
         * 一条主线,三条支线
         * NEW(创建了任务) RUNNABLE(准备执行/正在执行)  (发生的一系列操作) TERMINATED(结束)
         */
    }
    /**
     * 线程的所有状态
     *      1.NEW -> 开始状态(创建了线程,但是还没有执行)
     *      2.TERMINATED -> 结束状态(任务完成)
     *      3.RUNNABLE -> 就绪状态(线程在CPU调度/正在准备进行调度)
     *      4.WAITING -> 死等产生的堵塞
     *      5.TIMED_WAITING -> 超时等待产生的堵塞
     *      6.BLOCKED -> 锁竞争产生的堵塞
     */
    public static void main4(String[] args) throws InterruptedException {
        Thread t = new Thread(() ->{
            System.out.println("hello thread");
        });
        System.out.println(t.getState());
        t.start();
        t.join();
        System.out.println(t.getState());
    }
    /**
     * Thread类及常见方法
     *      5.等待一个线程
     *      6.获取当前线程引用
     *      7.休眠当前线程
     */
    public static void main3(String[] args) throws InterruptedException {
        /**
         * 休眠当前线程->sleep(),休眠当前线程,一般休眠时间会大于设定休眠时间
         */
        System.out.println(System.currentTimeMillis());
        sleep(1000);
        System.out.println(System.currentTimeMillis());
    }
    public static void main2(String[] args) {
        /**
         * 获取当前线程引用->currentThread(),返回当前线程引用,直接类调用
         */
        Thread thread = Thread.currentThread();
        System.out.println(thread.getName());
    }
    public static void main1(String[] args) throws InterruptedException {
        /**
         * 等待一个线程
         *      1.在那个线程调用join,那个线程就阻塞等待,只有调用join方法的线程结束,才能继续执行
         *      2.只能主线程等待其他线程,其他线程不能等待主线程,其他线程之间可以互相等待
         *      3.join方法可以设定时间,单位为ms,当超时线程未结束,可以执行其它线程
         */
        Thread t1 = new Thread(() ->{
            for(int i = 0;i < 5;i++) {
                System.out.println("t1");
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        t1.start();

        Thread t2 = new Thread(() -> {
            for(int i = 0;i < 5;i++) {
                System.out.println("t2");
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        t2.start();

        t1.join();
        t2.join();

        System.out.println("main线程结束");
    }
}
